package proj;

public class People {//类的首字母最好大写,public可以访问
	
	//PEOPLE_NUM是一个类变量，所有的类变量都放在静态存储区,所有people实例'共享'一个PEOPLE_NUM
	static public int PEOPLE_NUM;
	
	//name和age都是实例变量，实例变量跟随着对象，一起放在堆里 ； 有多少个实例对象，就有多少实例变量
	public String name;//强类型语言确认类型
	public int age;//declaration，类的成员变量,跟对象一起，放在堆里的，生命周期和对象一样长
	
	/*
	//构造方法：①名字和类一样②没有返回值,和返回类——创建对象进行初始化
	//constructors is a special method 
	//图形界面：一个窗口就是一个类
	
	public People(){
		
	}//overloading重载 : 构造方法可以有好多个，区别在于参数的数量和类型,根据选择自动调用
	//一个类中可以多个方法具有相同的名字，但参数必须不同
	
	public People(String name){//name是一个参数，和局部变量一样，放到栈里
		this.name=name;//构造方法 : 不写方法体，就会默认生成构造方法，没有任何参数
	}
	
	public void sayHello(){//methods方法是C++中的函数
		int i=1;//方法被调用的时候，局部/本地变量local被放到栈里，方法调用结束后。局部变量被释放
		System.out.println("hello");//构造方法和构造函数
	}
	
	public void sayHello(String word){
		System.out.println("hello"+word);
	}
	*/
	
	//函数传参：传值，传引用
	//传值：primitive基本类型（int…）
	//传引用：引用类型（对象，数组，接口）
	
	public People(){
		People.PEOPLE_NUM=PEOPLE_NUM+1;
	}
	public void access1(){//实例方法
		PEOPLE_NUM=100;//可以访问类变量
		age=100;//可以访问实例变量
	}
	static public void access2(){//类方法
		PEOPLE_NUM=100;//可以访问类变量
	//	age=100;//不可以访问实例变量
	}
	/*
	public void pass(int i){//方法的参数相当于局部变量
		//pass方法建立一个栈,栈里有局部变量i，占四个字节,把100=a赋值给i
		i=i+1;//栈里的局部变量i被+1,赋值被写到栈里
		System.out.println("i="+i);
		//方法结束，栈销毁了，局部变量i也就没有了,值101也就丢失了
	}
	
	public void pass(int []i){
		//pass方法建立一个栈，局部变量i,array指向的那个地址被赋给了i
		if(i.length>1)
			i[0]=i[0]+1;//这个赋值被写到了堆里
		System.out.println("i[0]="+i[0]);
		//方法结束，栈没了，堆还在（堆和JAVA虚拟机联系到一起），从而改变被保留下来
	}
	*/
	
}